using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;

namespace PMServiceDesk.DataAccess
{
    public class TransicionEstadoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public TransicionEstadoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy, _parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(TransicionEstadoType transicionEstado)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (transicionEstado.Id == null ? "0" : transicionEstado.Id));
                d.AddParameter("@PERMISOROLID", transicionEstado.PermisoRolId);
                d.AddParameter("@ESTADOORIGENID", transicionEstado.EstadoOrigenId);
                d.AddParameter("@ESTADODESTINOID", transicionEstado.EstadoDestinoId);
                d.AddParameter("@HABILITADO", transicionEstado.Habilitado);

                transicionEstado.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string permisoRolId,string estadoOrigenId, string estadoDestinoId)
        {
            using (DataUtil d = this._eliminarPorPermisoRol())
            {
                d.AddParameter("@PERMISOROLID", permisoRolId);
                d.AddParameter("@ESTADOORIGENID", estadoOrigenId);
                d.AddParameter("@ESTADODESTINOID", estadoDestinoId);

                d.ExecuteNonQuery();
            }
        }


        public void EliminarPorPermisoRolId(string permisoRolId)
        {
            using (DataUtil d = this._eliminarPorPermisoRol())
            {
                d.AddParameter("@PERMISOROLID", permisoRolId);

                d.ExecuteNonQuery();
            }
        }

        public TransicionEstadoType Cargar()
        {
            List<TransicionEstadoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<TransicionEstadoType> CargarLista()
        {
            List<TransicionEstadoType> l = new List<TransicionEstadoType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    TransicionEstadoType o = null;

                    while (r.Read())
                    {
                        o = new TransicionEstadoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PermisoRolId = r.GetValue(d.GetOrdinalReader("PERMISOROLID")).ToString();
                        o.EstadoOrigenId = r.GetValue(d.GetOrdinalReader("ESTADOORIGENID")).ToString();
                        o.EstadoDestinoId = r.GetValue(d.GetOrdinalReader("ESTADODESTINOID")).ToString();
                        o.Habilitado = Convert.ToBoolean(r.GetValue(d.GetOrdinalReader("HABILITADO")));

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<TransicionEstadoType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<TransicionEstadoType> l = new List<TransicionEstadoType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    TransicionEstadoType o = null;

                    while (r.Read())
                    {
                        o = new TransicionEstadoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PermisoRolId = r.GetValue(d.GetOrdinalReader("PERMISOROLID")).ToString();
                        o.EstadoOrigenId = r.GetValue(d.GetOrdinalReader("ESTADOORIGENID")).ToString();
                        o.EstadoDestinoId = r.GetValue(d.GetOrdinalReader("ESTADODESTINOID")).ToString();
                        o.Habilitado = Convert.ToBoolean(r.GetValue(d.GetOrdinalReader("HABILITADO")));

                        l.Add(o);
                    }
                }

            if (l.Count < _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM TRANSICIONESTADO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO TRANSICIONESTADO
                               (
                                   PERMISOROLID
                                  ,ESTADOORIGENID
                                  ,ESTADODESTINOID
                                  ,HABILITADO
                               )
                               VALUES
                               (
                                   @PERMISOROLID
                                  ,@ESTADOORIGENID
                                  ,@ESTADODESTINOID
                                  ,@HABILITADO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE TRANSICIONESTADO SET
                               PERMISOROLID=@PERMISOROLID
                              ,ESTADOORIGENID=@ESTADOORIGENID
                              ,ESTADODESTINOID=@ESTADODESTINOID
                              ,HABILITADO=@HABILITADO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminar()
        {
            string sql = @"DELETE FROM TRANSICIONESTADO 
                           WHERE PERMISOROLID=@PERMISOROLID 
                           AND ESTADOORIGENID=@ESTADOORIGENID
                           AND ESTADODESTINOID=@ESTADODESTINOID";


            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminarPorPermisoRol()
        {
            string sql = @"DELETE FROM TRANSICIONESTADO WHERE PERMISOROLID=@PERMISOROLID";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        TR.ID
                       ,TR.PERMISOROLID
                       ,TR.ESTADOORIGENID
                       ,TR.ESTADODESTINOID
                       ,TR.HABILITADO
                        ";

            _join = @"FROM DBO.TRANSICIONESTADO [TR] 
                      INNER JOIN PERMISOROLPAQUETETRABAJO [PR] ON TR.PERMISOROLID=PR.ID
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        TR.ID
                       ,TR.PERMISOROLID
                       ,TR.ESTADOORIGENID
                       ,TR.ESTADODESTINOID
                       ,TR.HABILITADO
                        ";

            _join = @"FROM DBO.TRANSICIONESTADO [TR] 
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND TR.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorPermisoRolId(string permisoRolId)
        {
            _where += @"AND TR.PERMISOROLID=@PERMISOROLID
                                 ";

            _parametrosConsulta.Add("@PERMISOROLID", permisoRolId);
        }
        public void FiltrarPorRolId(string rolId)
        {
            _where += @"AND PR.ROLID=@ROLID
                                 ";

            _parametrosConsulta.Add("@ROLID", rolId);
        }
        public void FiltrarPorEstadoOrigenId(string estadoOrigenId)
        {
            _where += @"AND TR.ESTADOORIGENID=@ESTADOORIGENID
                                 ";

            _parametrosConsulta.Add("@ESTADOORIGENID", estadoOrigenId);
        }
        public void FiltrarPorEstadoDestinoId(string estadoDestinoId)
        {
            _where += @"AND TR.ESTADODESTINOID=@ESTADODESTINOID
                                 ";

            _parametrosConsulta.Add("@ESTADODESTINOID", estadoDestinoId);
        }

        #endregion
    }
}
